/**
 * Simbolos del compilador
 * @author paco
 */
public class Simbolo
{
	/**
	 * Identificador del simbolo.
	 */
	protected String nombre;
	/**
	 * Tipo del simbolo declarado.
	 */
	protected Tipo tipo;
	/**
	 * Indica la posición en el .locals para hacer el .ldloc
	 */
	protected int localPos;
	/**
	 * Indica si es constante o no el simbolo.
	 */
	protected boolean constante;

	public Simbolo(String nombre, Tipo tipo)
	{
		this.nombre = nombre;
		this.tipo = tipo;
		this.constante = false;
	}

	public boolean isConstante()
	{
		return constante;
	}

	public void setConstante()
	{
		this.constante = true;
	}
	
	public Tipo getTipo()
	{
		return tipo;
	}

	public void setTipo(Tipo tipo)
	{
		this.tipo = tipo;
	}

	public int getLocalPos()
	{
		return localPos;
	}

	public void setLocalPos(int localPos)
	{
		this.localPos = localPos;
	}

	/**
	 * Obtiene el nombre del simbolo.
	 * @return  Nuevo nombre.
	 */
	public String getNombre()
	{
		return nombre;
	}

	/**
	 * Cambia el nombre del simbolo.
	 * @param nombre Nuevo nombre.
	 */
	public void setNombre(String nombre)
	{
		this.nombre = nombre;
	}
	
	/**
	 * Comprueba si un simbolo es funcion.
	 * @return True si es funcion.
	 */
	public boolean isFuncion()
	{
		return ( this instanceof SimboloFuncion );
	}
	
	/**
	 * Comprueba si un simbolo es un entero.
	 * @return True si es un entero.
	 */
	public boolean isEntero()
	{
		return ( this instanceof SimboloEntero );
	}
	
	/**
	 * Comprueba si un simbolo es una clase.
	 * @return True si es una clase.
	 */
	public boolean isClase()
	{
		return ( this instanceof SimboloClase );
	}
	
	/**
	 * Comprueba si un simbolo es un real.
	 * @return True si es un real.
	 */
	public boolean isReal()
	{
		return ( this instanceof SimboloReal );
	}
	
	/**
	 * Comprueba si un simbolo es un booleano.
	 * @return True si es un booleano.
	 */
	public boolean isBooleano()
	{
		return ( this instanceof SimboloBooleano );
	}
	
	public boolean isExcepcion()
	{
		return ( this instanceof SimboloExcepcion );
	}
	
	/**
	 * Obtiene el .locals de un simbolo.
	 * @return .locals
	 */
	public String getLocals()
	{
		StringBuilder locals = new StringBuilder();
		
		return locals.toString();
	}
	
	public String toWrite()
	{
		return "";
	}
	
	
	
	/**
	 * Obtiene el .locals de un simbolo.
	 * @param tabulacion Indentado.
	 * @return .locals
	 */
	public String getLocals(String tabulacion)
	{
		return "";
	}
	
	/**
	 * Obtiene la traducción de un simbolo.
	 * @return 
	 */
	@Override
	public String toString()
	{
		StringBuilder trad = new StringBuilder();
		
		trad.append(this.nombre).append(" ");
		trad.append(this.tipo);
		
		return trad.toString();
	}
	
	/**
	 * Traducción del simbolo.
	 * @return traducción.
	 */
	public String toString(String tabulacion)
	{
		StringBuilder trad = new StringBuilder();
		
		return trad.toString();
	}
}
